package org.laperra.tienda.model;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
public class Factura implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer idFactura;
	private Date fecha;
	private Cliente cliente;
	private Empleado empleado;
	private Set<LineaFactura> lineas = new HashSet<LineaFactura>(0);
	private Float totalFactura;
	
	public Factura(){}
	
	public Factura(Integer idFactura, Date fecha) {
		this.idFactura = idFactura;
		this.fecha = fecha;
	}

	
	public Factura(Date fecha, Set<LineaFactura> lineas) {
		this.fecha = fecha;
		this.lineas = lineas;
	}


	@Id
	@TableGenerator(name="idFactura",table="FacturaPrimaryKey",pkColumnName="facturaKey",pkColumnValue="facturaValor", allocationSize=1)
	@GeneratedValue(strategy=GenerationType.TABLE, generator="idFactura")//genera un valor para la clave de forma automatica
	@Column(unique = true, nullable = false)
	public Integer getIdFactura() {
		return idFactura;
	}
	public void setIdFactura(Integer idFactura) {
		this.idFactura = idFactura;
	}
	@Temporal(TemporalType.DATE)
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.factura", cascade=CascadeType.ALL)
	public Set<LineaFactura> getLineas() {
		return lineas;
	}
	public void setLineas(Set<LineaFactura> lineas) {
		this.lineas = lineas;
	}
	
	@ManyToOne
	@JoinColumn(name="idCliente")
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	@ManyToOne
	@JoinColumn(name="idEmpleado")
	public Empleado getEmpleado() {
		return empleado;
	}
	
	public void setEmpleado(Empleado empleado) {
		this.empleado = empleado;
	}
	@Transient
	public Float getTotalBaseImp(){
		float totalBaseImp=0;
		Iterator<LineaFactura>it=lineas.iterator();
		while (it.hasNext()){
			LineaFactura linea=(LineaFactura) it.next();
			totalBaseImp+=linea.getUnidades().intValue()*linea.getPrecioBase().floatValue();
		}
//		for (int i=0;i<lineas.size();i++){
//				LineaFactura linea=(LineaFactura) lineas.get(i);
//				totalBaseImp+=linea.getUnidades().intValue()*linea.getPrecioBase().floatValue();
//		}
		return Float.valueOf(totalBaseImp);
	}
	
	@Transient
	public Float getTotalIva(){
		float totalIva=0;
		Iterator<LineaFactura>it=lineas.iterator();
		while (it.hasNext()){
			LineaFactura linea=(LineaFactura) it.next();
			totalIva+=linea.getUnidades().intValue()*linea.getPorcentIva().floatValue()*linea.getPrecioBase().floatValue()/100;
		}
//		for (int i=0;i<lineas.size();i++){
//			LineaFactura linea=(LineaFactura)lineas.get(i);
//			totalIva+=linea.getUnidades().intValue()*linea.getPorcentIva().floatValue()*linea.getPrecioBase().floatValue()/100;
//		}
		return Float.valueOf(totalIva);
	}
	
	public Float getTotalFactura(){
		float total= 0;
		Iterator<LineaFactura> it=lineas.iterator();
		while (it.hasNext()){
			LineaFactura linea=(LineaFactura)it.next();
			total+=linea.getTotal().floatValue();
		}
		return Float.valueOf(total);
	}
	public void setTotalFactura(Float totalFactura) {
		this.totalFactura = totalFactura;
	}
	
	
	
	
}
